#ifndef OS_MEM_H
#define OS_MEM_H

#include "os_err.h"
#include "os_def.h"
#include "os_types.h"
#include "os_list.h"

#define OS_FLAG_MEM_HEAP                  (1 << 0)        // 采用的动态分配

// 将数据进行向上对齐或向下对齐到指定的字节数
#define MEM_HIGH_ALIGED(v, align)     (((uint32_t)(v) + ((align) - 1)) & ~((uint32_t)(align) - 1))
#define MEM_LOW_ALIGED(v, align)      (((uint32_t)(v)) & ~((uint32_t)(align) - 1))

/**
 * 内存块起始标记(目前12字节)
*/
typedef struct _os_mem_item_t {
    os_list_item_t item;

    struct {
        unsigned int used : 1;                  // 是否已经被分配出去
        unsigned int data_size : 31;                 // 整个空闲块的大小
    };
}os_mem_item_t;

typedef struct _os_mem_list_t {
    os_list_t list;
    void * heap_start;                          // 整个可用堆的起始地址
    int heap_size;
}os_mem_t;

os_err_t os_mem_init (void);
void * os_mem_malloc (int size);
os_err_t os_mem_free (void * mem);
int os_get_free_size (void);

#endif // OS_MEM_H

